home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / lib / hls2rgb.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  3KB  |  115 lines

  1. /*************************************************************************
  2.  *                                                                       *
  3.  *  Copyright (c) 1992, 1993 Ronald Joe Record                           *
  4.  *                                                                       *
  5.  *  All rights reserved. No part of this program or publication may be   *
  6.  *  reproduced, transmitted, transcribed, stored in a retrieval system,  *
  7.  *  or translated into any language or computer language, in any form or *
  8.  *  by any means, electronic, mechanical, magnetic, optical, chemical,   *
  9.  *  biological, or otherwise, without the prior written permission of:   *
  10.  *                                                                       *
  11.  *      Ronald Joe Record (408) 458-3718                                 *
  12.  *      212 Owen St., Santa Cruz, California 95062 USA                   *
  13.  *                                                                       *
  14.  *************************************************************************/
  15.  
  16. /* From colorwheel.c which is part of color3 by Hiram Clawson (hiramc@sco.com)*/
  17.  
  18. #include    <X11/Xlib.h>
  19. #include    <X11/Xutil.h>
  20.  
  21. #ifdef _NO_PROTO
  22. static double hue_value();
  23. #else
  24. static double hue_value( double, double, double );
  25. #endif
  26.  
  27. /***********************************************************************
  28.  * NAME: hls2rgb() from foley and van dam, fundamentals of interactive ...
  29.  *        page 619
  30.  *
  31.  * PURPOSE: Convert hls[0..3600][0..1000][0..1000] space to rgb space
  32.  *    That is the Hue, Lightness, Saturation color model.
  33.  *    Which is two cones, base to base, the bottom tip is black, the
  34.  *    top tip is white, the middle (bases) around the outside is a color
  35.  *    wheel.  The axis of this solid is Lightness.  Hue is the angular
  36.  *    measure around the cones, and the saturation is the radius from the
  37.  *    axis towards the surface of the cones.
  38.  ***********************************************************************/
  39. void hls2rgb( hue_light_sat, rgb )
  40. int hue_light_sat[3];
  41. int rgb[3];        /*    Each in range [0..65535]    */
  42. {
  43.     double r, g, b, h, l, s;
  44.     double m1, m2;
  45.  
  46.     h = (double) hue_light_sat[0] / 10.0;
  47.     l = (double) hue_light_sat[1] / 1000.0;
  48.     s = (double) hue_light_sat[2] / 1000.0;
  49.  
  50.     if ( l < 0.5 )
  51.     {
  52.         m2 = l * ( 1.0 + s );
  53.     }
  54.     else
  55.     {
  56.         m2 = l + s - (l * s);
  57.     }
  58.     m1 = (2.0 * l) - m2;
  59.     if ( (s + 1.0) == 1.0 )
  60.     {
  61.         if ( (h + 1.0) < 1.0 )
  62.         {
  63.             r = g = b = l;
  64.         }
  65.         else
  66.         {
  67.             r = g = b = 0.0;
  68.         }
  69.     }
  70.     else
  71.     {
  72.         r = hue_value( m1, m2, h - 120.0 );    /* changed this so that 0 is blue */
  73.         g = hue_value( m1, m2, h );            /* 120 is green, and -120 is red */
  74.         b = hue_value( m1, m2, h + 120.0 );    /* rr@sco.com 15-Feb-93 */
  75.     }
  76.     rgb[0] = 65535.0 * r;
  77.     rgb[1] = 65535.0 * g;
  78.     rgb[2] = 65535.0 * b;
  79.     if ( rgb[0] > 65535 )
  80.         rgb[0] = 65535;
  81.     else if ( rgb[0] < 0 )
  82.         rgb[0] = 0;
  83.  
  84.     if ( rgb[1] > 65535 )
  85.         rgb[1] = 65535;
  86.     else if ( rgb[1] < 0 )
  87.         rgb[1] = 0;
  88.  
  89.     if ( rgb[2] > 65535 )
  90.         rgb[2] = 65535;
  91.     else if ( rgb[2] < 0 )
  92.         rgb[2] = 0;
  93.  
  94.     return;
  95. }    /* end of void hls2rgb( hue_light_sat, rgb )    */
  96.  
  97. static double hue_value( n1, n2, hue )
  98. double n1;
  99. double n2;
  100. double hue;
  101. {
  102.     if ( hue > 360.0 )
  103.         hue -= 360.0;
  104.     if ( hue < 0.0 )
  105.         hue += 360.0;
  106.     if ( hue < 60.0 )
  107.         return  ( n1 + ((n2 - n1)*hue/60.0));
  108.     else if ( hue < 180.0 )
  109.         return ( n2 );
  110.     else if ( hue < 240.0 )
  111.         return ( n1 + ((n2 - n1)*(240.0 - hue)/60.0));
  112.     else
  113.         return( n1 );
  114. }    /* end of double hue_value( n1, n2, hue )    */
  115.